package com.vcredit.creditcat.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.vcredit.creditcat.dto.product.MerchantProductDto;
import com.vcredit.creditcat.vo.CarProductOutputVo;

public class AppUtil {

	public static <T> void excludeApplyProducts(List<T> cars, List<MerchantProductDto> applyProducts)
			throws ParseException {
		if (Utility.isNullOrEmpty(cars) || Utility.isNullOrEmpty(applyProducts)) {
			return;
		}
		Iterator<T> iterator = cars.iterator();
		while (iterator.hasNext()) {
			// 类型转换
			CarProductOutputVo carVo = null;
			MerchantProductDto productDto = null;
			T next = iterator.next();
			if (next instanceof CarProductOutputVo) {
				carVo = (CarProductOutputVo) next;
			} else {
				productDto = (MerchantProductDto) next;
			}

			for (MerchantProductDto merchantProductDto : applyProducts) {
				if (merchantProductDto
						.getProductId() == (productDto == null ? carVo.getProductId() : productDto.getProductId())) {
					if (!canProductApplyAgin(merchantProductDto)) {
						iterator.remove();
						break;
					}
				}
			}
		}
	}

	public static boolean canProductApplyAgin(MerchantProductDto merchantProductDto) throws ParseException {
		Integer auditResult = merchantProductDto.getAuditResult();
		String creditApplyTime = merchantProductDto.getCreditApplyTime(); // 下次申请时间
		Boolean isApply = merchantProductDto.getIsApply(); // 是否可以再次申请
		String creditExpiretime = merchantProductDto.getCreditExpiretime(); // 额度过期时间
		
		Date nowDate= new Date();
		if(auditResult == 1) { // 成功获取到额度
			if(StringUtils.isBlank(creditExpiretime)) {
				// 如果额度过期时间为空，默认不能再次申请
				return false;
			} else {
				Date amtExpireDatetime = ConcurrentDateUtil.strToDate(creditExpiretime);
				// 如果额度已过期，可以再次申请，否则不能再申请
				if(amtExpireDatetime.before(nowDate)) {
					return true;
				} else {
					return false;
				}
			}
		}
		
		else if(auditResult == 0) { // 额度获取失败
			if(isApply) {
				// 可以再次申请需要判断下次申请时间
				if(StringUtils.isBlank(creditApplyTime)) {
					// 下次申请时间为空，默认可以再次申请
					return true;
				} else {
					Date nextApplyTime = ConcurrentDateUtil.strToDate(creditApplyTime);
					// 如果下次申请时间已过，则可以再次申请
					if(nextApplyTime.before(nowDate)) {
						return true;
					} else {
						return false;
					}
				}
				
			} else { // 不能再次申请
				return false;
			}
		} 
		
		else if(auditResult == 3 || auditResult == 4) { // 兼容以前老数据可能出现的3、4这两种状态
			return true;
		}
		
		else { // 其他的都不能再次申请
			return false;
		}
	}

	/**
	 * 设置产品的申请状态
	 * 
	 * @author zhaoqi01
	 * @param undercarList
	 * @param applyProducts
	 */
	public static void setProductApplyStatus(List<CarProductOutputVo> undercarList,
			List<MerchantProductDto> applyProducts) {

		if (Utility.isNullOrEmpty(undercarList)) {
			return;
		}

		// 如果没有申请过任何产品，全部设置为未申请
		if (Utility.isNullOrEmpty(applyProducts)) {
			for (CarProductOutputVo carProductOutputVo : undercarList) {
				carProductOutputVo.setApplyStatus(3);
			}
			return;
		}

		// 将返回的产品状态设置为对应申请过的产品的状态
		for (CarProductOutputVo productOutputVo : undercarList) {
			productOutputVo.setApplyStatus(3);
			for (MerchantProductDto merchantProductDto : applyProducts) {
				if (productOutputVo.getProductId() == merchantProductDto.getProductId()) {
					productOutputVo.setApplyStatus(merchantProductDto.getAuditResult());
					break;
				}
			}
		}
	}

	public static String getStrTime(String cc_time) {
		String re_StrTime = null;
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 例如：cc_time=1291778220
		long lcc_time = Long.valueOf(cc_time);
		re_StrTime = sdf.format(new Date(lcc_time * 1000L));
		return re_StrTime;
	}
	 public static String stampToDate(String s){
	        String res;
	        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        long lt = new Long(s);
	        Date date = new Date(lt);
	        res = simpleDateFormat.format(date);
	        return res;
	    }
}
